package com.weijian.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.weijian.dal.dto.social.FollowUserDTO;
import com.weijian.dal.dto.social.UserStatsDTO;

import java.util.List;

/**
 * 社交功能服务接口
 * 提供用户关注、取消关注、查询粉丝/关注列表、课程点赞等功能
 */
public interface SocialService {

    /**
     * 关注用户
     * @param currentUserId 当前用户ID
     * @param targetUserId 目标用户ID
     * @return 是否关注成功
     */
    boolean followUser(Long currentUserId, Long targetUserId);

    /**
     * 取消关注用户
     * @param currentUserId 当前用户ID
     * @param targetUserId 目标用户ID
     * @return 是否取消成功
     */
    boolean unfollowUser(Long currentUserId, Long targetUserId);

    /**
     * 获取用户关注列表
     * @param userId 用户ID
     * @param page 分页参数
     * @return 关注用户列表
     */
    IPage<FollowUserDTO> getFollowingList(Long userId, IPage<FollowUserDTO> page);

    /**
     * 获取用户粉丝列表
     * @param userId 用户ID
     * @param page 分页参数
     * @return 粉丝用户列表
     */
    IPage<FollowUserDTO> getFollowersList(Long userId, IPage<FollowUserDTO> page);

    /**
     * 获取共同好友列表
     * @param userId1 用户1ID
     * @param userId2 用户2ID
     * @return 共同好友ID列表
     */
    List<Long> getMutualFriends(Long userId1, Long userId2);

    /**
     * 检查是否已关注
     * @param followerId 关注者ID
     * @param followingId 被关注者ID
     * @return 是否已关注
     */
    boolean isFollowing(Long followerId, Long followingId);

    /**
     * 点赞课程
     * @param userId 用户ID
     * @param courseId 课程ID
     * @return 是否点赞成功
     */
    boolean likeCourse(Long userId, Long courseId);

    /**
     * 取消点赞课程
     * @param userId 用户ID
     * @param courseId 课程ID
     * @return 是否取消成功
     */
    boolean unlikeCourse(Long userId, Long courseId);

    /**
     * 检查是否已点赞
     * @param userId 用户ID
     * @param courseId 课程ID
     * @return 是否已点赞
     */
    boolean hasLikedCourse(Long userId, Long courseId);

    /**
     * 获取用户点赞的课程列表
     * @param userId 用户ID
     * @param page 分页参数
     * @return 课程ID列表
     */
    IPage<Long> getLikedCourses(Long userId, IPage<Long> page);

    /**
     * 获取课程的点赞用户列表
     * @param courseId 课程ID
     * @param page 分页参数
     * @return 用户ID列表
     */
    IPage<Long> getCourseLikes(Long courseId, IPage<Long> page);

    /**
     * 获取课程点赞数
     * @param courseId 课程ID
     * @return 点赞数
     */
    Long getCourseLikeCount(Long courseId);

    /**
     * 获取用户社交统计信息
     * @param userId 用户ID
     * @return 社交统计信息
     */
    UserStatsDTO getUserStats(Long userId);

    /**
     * 获取关注排行榜
     * @param limit 限制数量
     * @return 用户ID列表
     */
    List<Long> getFollowingLeaderboard(int limit);

    /**
     * 获取获赞排行榜
     * @param limit 限制数量
     * @return 课程ID列表
     */
    List<Long> getLikesLeaderboard(int limit);

    /**
     * 同步Redis数据到数据库
     */
    void syncRedisToDatabase();

    /**
     * 从数据库加载数据到Redis
     */
    void loadDatabaseToRedis();
}